
import axios, { AxiosPromise } from 'axios';
import api from './api';
import stores from '../stores/index'
import { API } from '../config'
import { ObjStrKey } from '../types/base';
// console.log('API', API);

const req = axios.create({
    baseURL: API,
})

// 添加请求拦截器
req.interceptors.request.use(function (config: any) {
    // console.log('interceptors config', config);
    if (stores.User.token) {
        config.headers.Authorization = 'Bearer ' + stores.User.token
    }
    return config;
}, function (error: any) {
    return Promise.reject(error);
});

// 添加响应拦截器
req.interceptors.response.use(function (res: { data: any; }) {
    return res.data
}, function (error: { response: { data: any; }; }) {
    console.dir(error)
    return Promise.reject(error?.response?.data);
});


interface reqs {
    [reqname: string]: (data1?: ObjStrKey, ...args: any[]) => Promise<any>
}
let $http: reqs = {}

// 处理接口方法
/**
 * 请求方式为：
 * 一个object的时候
 * {非get的参数,get的参数，包括url的参数}
 * 两个object的时候
 * {get的参数，包括url的参数},{非get的参数}
 * 有function的时候
 * function为重写参数的函数，return 参数
 */
Object.keys(api).forEach((key: string) => {
    let valarr = api[key].split(':')

    $http[key] = (data1?: ObjStrKey, ...args: any[]): AxiosPromise => {

        let data2, rewriteAxiosConfigFn

        if (args.length === 1) {
            if (typeof args[0] === 'function') {
                rewriteAxiosConfigFn = args[0]
            } else {
                data2 = args[0]
            }
        } else if (args.length === 2) {
            [data2, rewriteAxiosConfigFn] = args
        }
        // console.log('请求参数：', data1, data2);


        let p: ObjStrKey = {
            method: valarr[0],
            url: valarr[1],
        }

        // 处理url中{}的参数，输入参数名为{}内的字母
        if (/{/.test(valarr[1])) {
            p.url = valarr[1].replace(/{(\w+)}/g, (w: any) => {
                // console.log(args);
                // console.log(data1,w);
                return data1?.[w.slice(1, w.length - 1)]
            })
            if (valarr[0] === 'get' && data2) {
                p.params = data2
            }
            if ((valarr[0] !== 'get') && data2) {
                p.data = data2
            }
        } else {
            if (valarr[0] === 'get' && data1) {
                p.params = data1
            }
            if ((valarr[0] !== 'get') && data1) {
                p.data = data1
            }
        }

        // 允许重写axios的参数
        if (rewriteAxiosConfigFn) {
            // console.log(rewriteAxiosConfigFn);
            p = rewriteAxiosConfigFn(p)
        }
        // console.log(p);
        return req(p)
    }
});

export default $http;

console.log(api);
